package com.mybatis.lo.dao;

import com.mybatis.lo.po.User;
import com.mybatis.lo.sqlsession.SqlSession;

import java.util.List;


/**
 * 面向对象仿照mybatis实现
 * @author zhangbh
 */
public class UserDaoImplWithMybatis implements UserDao {

    private SqlSession sqlSession;

    public UserDaoImplWithMybatis(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public User queryUserById(Integer id) {
        return sqlSession.queryOne("test.queryUserById", id);
    }

    @Override
    public List<User> queryUserByName(String username) {
        // return sqlSession.queryList("test.queryUserByName", username);
        // 尝试传入对象
        return sqlSession.queryList("test.queryUserByName", User.builder().username(username).build());
    }

    @Override
    public List<User> queryUser(User user) {
        return sqlSession.queryList("test.queryUser", user);
    }

    // SqlSessionFactoryBuilder：使用构建者模式去创建SqlSessionFactory
    // SqlSessionFactory:很多个千篇一律的对象
    // 	 SqlSession openSession();
    // Configuration
    //SqlSession.selectOne(String statementId, Object param)
    //SqlSession.selectList(String statementId, Object param)

    // statement执行，分为多种：批处理、简单实现
    // 加入缓存的使用
    // 【Executor】：
    // CachingExecutor：解决的是二级缓存的使用
    // BaseExecutor：解决的是一级缓存的使用
    // SimpleExecutor：正常Statement、PrepareStatement进行执行
    // BatchExecutor：批处理执行Statement
    // ReuseExecutor：重复使用Statement去完成相关SQL操作

    // 定义【StatementHandler】：用于统一处理各种类型的Statement，包括创建、参数设置和执行、结果处理
    // PreparedStatementHandler
    // SimpleStatementHandler
    // CallableStatementHandler

    // 定义【ParameterHandler】：专门解决参数设置
    // 定义【ResultSetHandler】：专门解决结果映射


}
